package com.example.lab.controller;

import com.example.lab.entity.Laboratories;
import com.example.lab.result.PageResult;
import com.example.lab.result.Result;
import com.example.lab.service.ILaboratoriesService;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.*;

/**
 * 实验室控制器类，用于处理与实验室相关的HTTP请求
 */
@RestController
@RequestMapping("/api/laboratories")
@RequiredArgsConstructor
public class LaboratoryController {

    /**
     * 实验室服务接口的实例，用于调用实验室相关的业务逻辑
     */
    private final ILaboratoriesService laboratoriesService;

    /**
     * 获取实验室列表
     *
     * @param collegeId 学院ID，可选参数，如果提供，则根据学院ID过滤实验室
     * @param page 页码，默认为1，用于分页查询
     * @param limit 每页数量，默认为10，用于分页查询
     * @return 返回包含实验室列表的分页结果
     */
    @GetMapping
    public Result<PageResult<Laboratories>> getLaboratories(
            @RequestParam(required = false) Integer collegeId,
            @RequestParam(defaultValue = "1") Integer page,
            @RequestParam(defaultValue = "10") Integer limit) {
        PageResult<Laboratories> result = laboratoriesService.getLaboratories(collegeId, page, limit);
        return Result.success(result);
    }

    /**
     * 根据实验室ID获取实验室信息
     *
     * @param labId 实验室ID
     * @return 返回指定ID的实验室信息
     */
    @GetMapping("/{labId}")
    public Result<Laboratories> getLaboratoryById(@PathVariable Integer labId) {
        Laboratories laboratory = laboratoriesService.getLaboratoryById(labId);
        return Result.success(laboratory);
    }

    /**
     * 创建新实验室
     *
     * @param laboratory 实验室对象，包含要创建的实验室的信息
     * @return 如果创建成功，返回成功结果及实验室ID；否则返回创建失败的消息
     */
    @PostMapping
    public Result<?> createLaboratory(@RequestBody Laboratories laboratory) {
        boolean success = laboratoriesService.createLaboratory(laboratory);
        if (success) {
            return Result.success(laboratory.getLabId());
        }
        return Result.fail("创建实验室失败");
    }

    /**
     * 更新实验室信息
     *
     * @param labId 实验室ID
     * @param laboratory 实验室对象，包含更新后的实验室信息
     * @return 如果更新成功，返回成功结果；否则返回更新失败的消息
     */
    @PutMapping("/{labId}")
    public Result<?> updateLaboratory(@PathVariable Integer labId, @RequestBody Laboratories laboratory) {
        try {
            boolean success = laboratoriesService.updateLaboratory(labId, laboratory);
            if (success) {
                return Result.success();
            }
            return Result.fail("更新实验室失败");
        } catch (RuntimeException e) {
            return Result.fail(e.getMessage());
        }
    }

    /**
     * 删除实验室
     *
     * @param labId 实验室ID
     * @return 如果删除成功，返回成功结果；否则返回删除失败的消息
     */
    @DeleteMapping("/{labId}")
    public Result<?> deleteLaboratory(@PathVariable Integer labId) {
        boolean success = laboratoriesService.deleteLaboratory(labId);
        if (success) {
            return Result.success();
        }
        return Result.fail("删除实验室失败");
    }
}
